"""
用户模块相关
"""
import random
import string
from django.db import models

# Create your models here.

from django.contrib.auth.models import AbstractUser


class Account(AbstractUser):
    """
    创建用户模型
    """
    phone = models.CharField(max_length=13, blank=True, null=True, verbose_name='手机号')
    status = models.IntegerField(default=1, verbose_name='维修人员状态')
    image_path = models.CharField(max_length=200, verbose_name='头像地址', default='')
    inviter_code = models.CharField(max_length=20, verbose_name='注册时填写邀请码', default='')
    invited_code = models.CharField(max_length=20, verbose_name='自己的邀请码', default='')
    invite_integral = models.IntegerField(default=0, verbose_name='邀请积分')

    def __str__(self):
        return self.username

    class Meta:
        """
        重命名
        """
        db_table = 'account_account'

    @classmethod
    def check_phone(cls, number):
        """
        验证手机号是否被注册

        return False  验证失败    True 验证通过
        """
        user = cls.objects.filter(phone=number).first()
        if not user:
            return True
        return False

    def update_status(self, status):
        """
        更新状态
        status
        """
        self.status = status
        self.save()

    def create_invited_code(self):
        """
        生成自己的邀请码
        """
        str_list = random.sample(string.ascii_uppercase + string.digits, 5)
        code = ''.join(str_list) + str(self.id)
        self.invited_code = code
        self.save()

    def add_invite_integral(self, count, info=''):
        """
        增加邀请积分
        count 积分数量
        info  积分增加的原因
        """
        # TODO 增加日志，记录积分变化的原因
        # TODO 增加表，用户可以查看自己的积分变化详情
        self.invite_integral += count
        self.save()

    def reduce_invite_integral(self, count, info=''):
        """
        减少邀请积分
        :param count:
        :param info:
        :return:
        """
        # TODO 增加日志，记录积分变化的原因
        # TODO 增加表，用户可以查看自己的积分变化详情
        # TODO 是否需要判断数值的合法性
        self.invite_integral -= count
        self.save()


class UserFriend(models.Model):
    """
    好友列表
    """
    user_id = models.IntegerField(blank=True, null=True)
    friend_id = models.IntegerField(blank=True, null=True)
    nick_name = models.CharField(max_length=50, verbose_name='好友备注', default='')
    # user = models.ForeignKey(Account, on_delete=models.CASCADE, default='')
    # friend = models.ForeignKey('Account', related_name='friends', verbose_name='好友列表')

    class Meta:
        """
        重命名
        """
        db_table = 'account_user_friend'


class Resource(models.Model):
    """
    权限 资源表

    用户可以访问哪些前端页面
    1、url = '/mail'  管理员
    2、url = '/add_mail' 所有登录用户展示
    3、ulr = '/show_car' 管理员
    """
    name = models.CharField(max_length=50, verbose_name='权限描述', default='')
    url = models.CharField(max_length=200, verbose_name='url地址', default='')
    status = models.IntegerField(default=1, verbose_name='是否可用1可用 0不可用')
    pid = models.IntegerField(verbose_name='父id', default='0')

    def __str__(self):
        return "{}:{}".format(self.name, self.url)

    class Meta:
        """
        重命名
        """
        db_table = 'account_resource'


class Role(models.Model):
    """
    角色表

    角色一：1、2、3
    角色二：2、3
    """
    name = models.CharField(max_length=50, verbose_name='权限组名称', default='')
    desc = models.CharField(max_length=50, verbose_name='权限组描述', default='')
    user = models.ManyToManyField(Account)
    resource = models.ManyToManyField(Resource)

    def __str__(self):
        return self.name

    class Meta:
        """
        重命名
        """
        db_table = 'account_role'
